package liecai_class.day06;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;

/**
 * BlockingQueue 阻塞式队列
 *
 * ArrayBlockingQueue
 *  基于数组的阻塞式队列 必须在创建时指定容量 容量一旦指定无法修改
 *  效率相对更高 有界相对安全 不会出现内存溢出
 * LinkedBlockingQueue
 *  基于链表的阻塞式队列 容量可以指定也可以不指定 如果不指定容量 则容量默认为Integer.MAX_VALUE 基本上可以认为是无限大
 *  效率相对更低 无界相对不安全 会出现内存溢出
 */
public class Demo02 {
    public static void main(String[] args) throws InterruptedException {
        BlockingQueue queue = new ArrayBlockingQueue(3);
        //BlockingQueue queue2 = new LinkedBlockingQueue();

        new Thread(new Runnable() {
            @Override
            public void run() {
                for(int i = 0;i<10000;i++){
                    try{
                        Thread.sleep(5000);
                        queue.put("x"+i);
                        System.out.println("写入数据x"+i);
                    }catch (Exception e){
                        e.printStackTrace();
                    }
                }
            }
        }).start();
        new Thread(new Runnable() {
            @Override
            public void run() {
                for(int i = 0;i<10000;i++){
                    try{
                        Thread.sleep(2000);
                        System.out.println("读取数据"+queue.take());
                    }catch (Exception e){
                        e.printStackTrace();
                    }
                }
            }
        }).start();

    }
}
